home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
newmat.exe
/
NEWMAT4.CXX
< prev
next >
Wrap
C/C++ Source or Header
|
1991-07-30
|
11KB
|
347 lines
//$$ newmat4.cxx Constructors, ReDimension, basic utilities
// Copyright (C) 1991: R B Davies and DSIR
#include "include.hxx"
#include "boolean.hxx"
typedef double real; // all floating point double
#include "newmat.hxx"
#include "newmatrc.hxx"
//#define REPORT { static ExeCounter ExeCount(__LINE__,4); ExeCount++; }
#define REPORT {}
//#define REPORT1 { static ExeCounter ExeCount(__LINE__,4); ExeCount++; }
// REPORT1 constructors only - doesn't work in turbo and Borland C++
#define REPORT1 {}
//#define MONITOR(what,storage,store) \
// { cout << what << " " << storage << " at " << (long)store << "\n"; }
#define MONITOR(what,store,storage) {}
/*************************** general utilities *************************/
static int tristore(int n) // els in triangular matrix
{ return (n*(n+1))/2; }
/****************************** constructors ***************************/
GeneralMatrix::GeneralMatrix()
{ store=0; storage=0; nrows=0; ncols=0; tag=-1; }
GeneralMatrix::GeneralMatrix(int s)
{
REPORT1
storage=s; tag=-1;
store = new real [storage]; MatrixErrorNoSpace(store);
MONITOR("Make (GenMatrix)",storage,store)
}
Matrix::Matrix(int m, int n) : GeneralMatrix(m*n)
{ REPORT1 nrows=m; ncols=n; }
SymmetricMatrix::SymmetricMatrix(int n) : GeneralMatrix(tristore(n))
{ REPORT1 nrows=n; ncols=n; }
UpperTriangularMatrix::UpperTriangularMatrix(int n)
: GeneralMatrix(tristore(n))
{ REPORT1 nrows=n; ncols=n; }
LowerTriangularMatrix::LowerTriangularMatrix(int n)
: GeneralMatrix(tristore(n))
{ REPORT1 nrows=n; ncols=n; }
DiagonalMatrix::DiagonalMatrix(int m) : GeneralMatrix(m)
{ REPORT1 nrows=m; ncols=m; }
Matrix::Matrix(BaseMatrix& M)
{
REPORT1 CheckConversion(M);
GeneralMatrix* gmx=M.Evaluate(MatrixType::Rect); GetMatrix(gmx);
}
RowVector::RowVector(BaseMatrix& M) : Matrix(M)
{
if (nrows!=1) MatrixError("Illegal conversion to row vector"); }
ColumnVector::ColumnVector(BaseMatrix& M) : Matrix(M)
{
if (ncols!=1) MatrixError("Illegal conversion to column vector"); }
SymmetricMatrix::SymmetricMatrix(BaseMatrix& M)
{
REPORT1 CheckConversion(M);
GeneralMatrix* gmx=M.Evaluate(MatrixType::Sym); GetMatrix(gmx);
}
UpperTriangularMatrix::UpperTriangularMatrix(BaseMatrix& M)
{
REPORT1 CheckConversion(M);
GeneralMatrix* gmx=M.Evaluate(MatrixType::UT); GetMatrix(gmx);
}
LowerTriangularMatrix::LowerTriangularMatrix(BaseMatrix& M)
{
REPORT1 CheckConversion(M);
GeneralMatrix* gmx=M.Evaluate(MatrixType::LT); GetMatrix(gmx);
}
DiagonalMatrix::DiagonalMatrix(BaseMatrix& M)
{
REPORT1 CheckConversion(M);
GeneralMatrix* gmx=M.Evaluate(MatrixType::Diag); GetMatrix(gmx);
}
GeneralMatrix::~GeneralMatrix()
{
if (store)
{
MONITOR("Free (GenMatrix)",storage,store)
delete [storage] store;
}
}
CroutMatrix::CroutMatrix(BaseMatrix& m)
{
REPORT1
GeneralMatrix* gm = m.Evaluate(MatrixType::Rect); GetMatrix(gm);
if (nrows!=ncols) MatrixError("Matrix not square");
d=TRUE; indx=new int [nrows]; MatrixErrorNoSpace(indx);
ludcmp();
}
/**************************** ReDimension matrices ***************************/
void GeneralMatrix::ReDimension(int nr, int nc, int s)
{
REPORT
if (store)
{
MONITOR("Free (ReDimensi)",storage,store)
delete [storage] store;
}
storage=s; nrows=nr; ncols=nc;
store = new real [storage]; MatrixErrorNoSpace(store);
MONITOR("Make (ReDimensi)",storage,store)
}
void Matrix::ReDimension(int nr, int nc)
{ REPORT GeneralMatrix::ReDimension(nr,nc,nr*nc); }
void SymmetricMatrix::ReDimension(int nr)
{ REPORT GeneralMatrix::ReDimension(nr,nr,tristore(nr)); }
void UpperTriangularMatrix::ReDimension(int nr)
{ REPORT GeneralMatrix::ReDimension(nr,nr,tristore(nr)); }
void LowerTriangularMatrix::ReDimension(int nr)
{ REPORT GeneralMatrix::ReDimension(nr,nr,tristore(nr)); }
void DiagonalMatrix::ReDimension(int nr)
{ REPORT GeneralMatrix::ReDimension(nr,nr,nr); }
void RowVector::ReDimension(int nc)
{ REPORT GeneralMatrix::ReDimension(1,nc,nc); }
void ColumnVector::ReDimension(int nr)
{ REPORT GeneralMatrix::ReDimension(nr,1,nr); }
/********************* manipulate types, storage **************************/
int GeneralMatrix::search(const GeneralMatrix* s) const
{ REPORT return (s==this) ? 1 : 0; }
int AddedMatrix::search(const GeneralMatrix* s) const
{ REPORT return bm1->search(s) + bm2->search(s); }
int ShiftedMatrix::search(const GeneralMatrix* s) const
{ REPORT return bm->search(s); }
int NegatedMatrix::search(const GeneralMatrix* s) const
{ REPORT return bm->search(s); }
int ConstMatrix::search(const GeneralMatrix* s) const
{ REPORT return (s==cgm) ? 1 : 0; }
MatrixType AddedMatrix::Type() const
{ REPORT return bm1->Type() + bm2->Type(); }
MatrixType MultipliedMatrix::Type() const
{ REPORT return bm1->Type() * bm2->Type(); }
MatrixType SolvedMatrix::Type() const
{ REPORT return bm1->Type().i() * bm2->Type(); }
MatrixType SubtractedMatrix::Type() const
{ REPORT return bm1->Type() - bm2->Type(); }
MatrixType ShiftedMatrix::Type() const
{ REPORT MatrixType mteqel(MatrixType::EqEl); return bm->Type() + mteqel; }
MatrixType ScaledMatrix::Type() const { REPORT return bm->Type(); }
MatrixType TransposedMatrix::Type() const { REPORT return bm->Type().t(); }
MatrixType NegatedMatrix::Type() const { REPORT return bm->Type(); }
MatrixType InvertedMatrix::Type() const { REPORT return bm->Type().i(); }
MatrixType ConstMatrix::Type() const { REPORT return cgm->Type(); }
int AddedMatrix::NrowsV() const { return bm1->NrowsV(); }
int ShiftedMatrix::NrowsV() const { return bm->NrowsV(); }
int TransposedMatrix::NrowsV() const { return bm->NcolsV(); }
int NegatedMatrix::NrowsV() const { return bm->NrowsV(); }
int ColedMatrix::NrowsV() const { return bm->NrowsV() * bm->NcolsV(); }
int DiagedMatrix::NrowsV() const { return bm->NrowsV() * bm->NcolsV(); }
int ConstMatrix::NrowsV() const { return cgm->Nrows(); }
int AddedMatrix::NcolsV() const { return bm2->NcolsV(); }
int ShiftedMatrix::NcolsV() const { return bm->NcolsV(); }
int TransposedMatrix::NcolsV() const { return bm->NrowsV(); }
int NegatedMatrix::NcolsV() const { return bm->NcolsV(); }
int RowedMatrix::NcolsV() const { return bm->NrowsV() * bm->NcolsV(); }
int DiagedMatrix::NcolsV() const { return bm->NrowsV() * bm->NcolsV(); }
int ConstMatrix::NcolsV() const { return cgm->Ncols(); }
// Rules regarding tDelete, reuse, GetStore
// All matrices processed during expression evaluation must be subject
// to exactly one of reuse(), tDelete(), GetStore() or BorrowStore().
// If reuse returns TRUE the matrix must be reused.
// GetMatrix(gm) always calls gm->GetStore()
// gm->Evaluate obeys rules
// bm->Evaluate obeys rules for matrices in bm structure
void GeneralMatrix::tDelete()
{
if (tag<0)
{
if (tag<-1) { REPORT store=0; delete this; return; } // borrowed
else { REPORT return; }
}
if (tag==1)
{
REPORT MONITOR("Free (tDelete)",storage,store)
if (store) delete [storage] store; store=0; tag=-1; return;
}
if (tag==0) { REPORT delete this; return; }
REPORT tag--; return;
}
BOOL GeneralMatrix::reuse()
{
if (tag<-1)
{
REPORT
real* s = new real [storage]; MatrixErrorNoSpace(s);
MONITOR("Make (reuse)",storage,s)
real* s1=store; real* s2=s; int i=storage;
while(i--) *s2++ = *s1++;
store=s; tag=0; return TRUE;
}
if (tag<0) { REPORT return FALSE; }
if (tag<=1) { REPORT return TRUE; }
REPORT tag--; return FALSE;
}
real* GeneralMatrix::GetStore()
{
if (tag<0 || tag>1)
{
real* s = new real [storage]; MatrixErrorNoSpace(s);
MONITOR("Make (GetStore)",storage,s)
real* s1=store; real* s2=s; int i=storage;
while(i--) *s2++ = *s1++;
if (tag>1) { REPORT tag--; }
else if (tag < -1) { REPORT store=0; delete this; } // b